// 数组的常用方法

let numbers = [1, 2, 3, 4, 5]

// 遍历数组
for number in numbers {
    print(number)
}

// 带索引遍历
for (index, number) in numbers.enumerated() {
    print("Index: \(index), Value: \(number)")
}

// 查找元素
// contains(_:): 检查是否包含特定元素。
print(numbers.contains(3))  // 输出: true

// first(where:): 返回第一个满足条件的元素。
if let firsetEven = numbers.first(where: { $0 % 2 == 0 }) {
    print("第一个偶数是：\(firsetEven)")
} else {
    print("没有找到偶数")
}

// firstIndex(of: )
if let index = numbers.firstIndex(of: 21) {
    print("元素 21 的索引是：\(index)")
} else {
    print("没有找到元素 21")
}

// 过滤和转换

// filter(_:): 返回满足条件的新数组。
let oddNumbers = numbers.filter { $0 % 2 != 0 }

// map(_:): 对每个元素应用转换，返回新数组。
let doubledNumbers = numbers.map { $0 * 2 }

// compactMap(_:): 转换并过滤掉nil结果。
let strings = ["1", "2", "three", "4"]
let nummbersFromStrings = strings.compactMap { String in Int(String) }
let nummbersFromStrings1 = strings.compactMap { Int($0) }

print(nummbersFromStrings)  // 输出: [1, 2, 4]

// flatMap(_:): 扁平化嵌套数组。
let nestedArray = [[1, 2], [3, 4], [5]]
let flatArray = nestedArray.flatMap { $0 }
print(flatArray)  // 输出: [1, 2, 3, 4, 5]

// 归约和聚合
// reduce(_:_:): 将数组归约为单个值。
let sum = numbers.reduce(0, +)
print("Sum: \(sum)")  // 输出: Sum: 15

// joined()`**: 将数组元素（通常是字符串）连接成一个字符串
let words = ["Hello", "World"]
let joinedString = words.joined(separator: " ")
print(joinedString)  // 输出: Hello World

// 排序
let sorted = numbers.sorted()  // 升序
print("Sorted: \(sorted)")  // 输出: Sorted: [1, 2, 3, 4, 5]

let sortedDescending = numbers.sorted(by: >)  // 降序
print("Sorted Descending: \(sortedDescending)")  // 输出: Sorted Descending: [5, 4, 3, 2, 1]

// sort()直接修改原数组
var mutableNumbers = [5, 3, 1, 4, 2]
mutableNumbers.sort()  // 升序
print("Sorted in place: \(mutableNumbers)")  // 输出: Sorted in place: [1, 2, 3, 4, 5]
// sorted(by:) 直接修改原数组
// mutableNumbers.sort(by: >)  // 降序

// 翻转数组
let reversed = numbers.reversed()
print(Array(reversed))  // 输出: [5, 4, 3, 2, 1]
// reversed() 返回一个反转的序列，但不修改原数组。
// reverse() 直接修改原数组
mutableNumbers.reverse()  // 直接修改原数组
print(mutableNumbers)  // 输出: [5, 4, 3, 2, 1]

// 多维数组

// 数组切片
